package com.example.demo2_review.design_pattern.concurrency_patterns.producer_consumer_Pattern;

import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.LinkedList;

/**
 * @Author zwp14
 * @create 2024/6/25 1:32
 * @description
 */
@Slf4j
public class Buffer1 {
    /**
     * 仓库
     */
    private final LinkedList<Integer> list;
    /**
     * 容积
     */
    private final int capacity;

    /**
     * 有参构造
     * @param capacity 仓库容积
     */
    public Buffer1(int capacity) {
        this.capacity = capacity;
        this.list = new LinkedList<>();
    }

    /**
     * 生产者
     * @param value 商品数量
     */
    public void product(int value){
        synchronized (this) {
            //当商品数量达到库存容积将不再生产，等待被唤醒
            while (list.size() == capacity) {
                try {
                    log.info("当商品数量达到库存容积将不再生产，等待被唤醒!");
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //如果仓库容积未达到上限，将生产的物品添加到仓库中并通知消费者前来消费
            log.info("Producer produced: {},并通知消费者前来消费！", value);
            list.add(value);
            notify();
        }
    }

    /**
     * @return 消费者
     */
    public int consume() {
        synchronized (this) {
            //如果仓库没有货物，消费者等待消费，并通知生产者生产
            while (CollectionUtil.isEmpty(list)) {
                try {
                    log.info("仓库没有货物，消费者等待消费，并通知生产者生产!");
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //移除并返回第一个元素-模拟消费
            Integer value = list.removeFirst();
            log.info("Consumer consumed: {},并通知生产者生产!" ,value);
            return value;
        }

    }
}
